Hrvatski

Otključajte moć TypeScript `as const` tvrdnji za inferenciju nepromjenjivih tipova, poboljšavajući sigurnost i predvidljivost koda u vašim projektima. Naučite kako ih učinkovito koristiti uz praktične primjere.

TypeScript `as const` tvrdnje: Inferencija nepromjenjivih tipova za robustan kod

TypeScript, nadskup JavaScripta, donosi statičko tipiziranje u dinamični svijet web razvoja. Jedna od njegovih moćnih značajki je inferencija tipova, gdje prevoditelj automatski zaključuje tip varijable. `Const` tvrdnje (eng. const assertions), uvedene u TypeScriptu 3.4, podižu inferenciju tipova na novu razinu, omogućujući vam da nametnete nepromjenjivost i stvorite robusniji i predvidljiviji kod.

Što su `as const` tvrdnje?

`Const` tvrdnje su način da TypeScript prevoditelju kažete da namjeravate da vrijednost bude nepromjenjiva (immutable). Primjenjuju se pomoću sintakse as const nakon doslovne vrijednosti ili izraza. To nalaže prevoditelju da zaključi najuži mogući (doslovni) tip za izraz i označi sva svojstva kao readonly.

U suštini, `const` tvrdnje pružaju jaču razinu sigurnosti tipova od jednostavnog deklariranja varijable s const. Iako const sprječava ponovno dodjeljivanje vrijednosti samoj varijabli, ne sprječava izmjenu objekta ili polja na koje varijabla referencira. `Const` tvrdnje sprječavaju i izmjenu svojstava objekta.

Prednosti korištenja `as const` tvrdnji

Praktični primjeri

Primjer 1: Osnovna upotreba s doslovnom vrijednosti (literalom)

Bez `const` tvrdnje, TypeScript zaključuje da je tip varijable message jednak string:


const message = "Hello, World!"; // Tip: string

S `const` tvrdnjom, TypeScript zaključuje da je tip doslovni string "Hello, World!":


const message = "Hello, World!" as const; // Tip: "Hello, World!"

To vam omogućuje korištenje doslovnog tipa stringa u preciznijim definicijama i usporedbama tipova.

Primjer 2: Korištenje `const` tvrdnji s poljima (arrays)

Razmotrimo polje boja:


const colors = ["red", "green", "blue"]; // Tip: string[]

Iako je polje deklarirano s const, i dalje možete mijenjati njegove elemente:


colors[0] = "purple"; // Nema greške
console.log(colors); // Izlaz: ["purple", "green", "blue"]

Dodavanjem `const` tvrdnje, TypeScript zaključuje da je polje n-torka (tuple) stringova koji su samo za čitanje:


const colors = ["red", "green", "blue"] as const; // Tip: readonly ["red", "green", "blue"]

Sada će pokušaj izmjene polja rezultirati TypeScript greškom:


// colors[0] = "purple"; // Greška: Indeksni potpis u tipu 'readonly ["red", "green", "blue"]' dopušta samo čitanje.

Ovo osigurava da polje colors ostane nepromjenjivo.

Primjer 3: Korištenje `const` tvrdnji s objektima

Slično poljima, objekti se također mogu učiniti nepromjenjivima pomoću `const` tvrdnji:


const person = {
  name: "Alice",
  age: 30,
}; // Tip: { name: string; age: number; }

Čak i s const, i dalje možete mijenjati svojstva objekta person:


person.age = 31; // Nema greške
console.log(person); // Izlaz: { name: "Alice", age: 31 }

Dodavanje `const` tvrdnje čini svojstva objekta readonly:


const person = {
  name: "Alice",
  age: 30,
} as const; // Tip: { readonly name: "Alice"; readonly age: 30; }

Sada će pokušaj izmjene objekta rezultirati TypeScript greškom:


// person.age = 31; // Greška: Nije moguće dodijeliti vrijednost svojstvu 'age' jer je svojstvo samo za čitanje.

Primjer 4: Korištenje `const` tvrdnji s ugniježđenim objektima i poljima

`Const` tvrdnje se mogu primijeniti na ugniježđene objekte i polja kako bi se stvorile duboko nepromjenjive strukture podataka. Razmotrite sljedeći primjer:


const config = {
  apiUrl: "https://api.example.com",
  endpoints: {
    users: "/users",
    products: "/products",
  },
  supportedLanguages: ["en", "fr", "de"],
} as const;

// Tip:
// {
//   readonly apiUrl: "https://api.example.com";
//   readonly endpoints: {
//     readonly users: "/users";
//     readonly products: "/products";
//   };
//   readonly supportedLanguages: readonly ["en", "fr", "de"];
// }

U ovom primjeru, objekt config, njegov ugniježđeni objekt endpoints i polje supportedLanguages su svi označeni kao readonly. To osigurava da se nijedan dio konfiguracije ne može slučajno izmijeniti tijekom izvođenja.

Primjer 5: `Const` tvrdnje s povratnim tipovima funkcija

Možete koristiti `const` tvrdnje kako biste osigurali da funkcija vraća nepromjenjivu vrijednost. Ovo je posebno korisno prilikom stvaranja pomoćnih funkcija koje ne bi trebale mijenjati svoj ulaz ili proizvoditi promjenjivi izlaz.


function createImmutableArray(items: T[]): readonly T[] {
  return [...items] as const;
}

const numbers = [1, 2, 3];
const immutableNumbers = createImmutableArray(numbers);

// Tip od immutableNumbers: readonly [1, 2, 3]

// immutableNumbers[0] = 4; // Greška: Indeksni potpis u tipu 'readonly [1, 2, 3]' dopušta samo čitanje.

Slučajevi upotrebe i scenariji

Upravljanje konfiguracijom

`Const` tvrdnje su idealne za upravljanje konfiguracijom aplikacije. Deklariranjem vaših konfiguracijskih objekata s as const, možete osigurati da konfiguracija ostane dosljedna tijekom cijelog životnog ciklusa aplikacije. To sprječava slučajne izmjene koje bi mogle dovesti do neočekivanog ponašanja.


const appConfig = {
  appName: "My Application",
  version: "1.0.0",
  apiEndpoint: "https://api.example.com",
} as const;

Definiranje konstanti

`Const` tvrdnje su također korisne za definiranje konstanti sa specifičnim doslovnim tipovima. To može poboljšati sigurnost tipova i jasnoću koda.


const HTTP_STATUS_OK = 200 as const; // Tip: 200
const HTTP_STATUS_NOT_FOUND = 404 as const; // Tip: 404

Rad s Reduxom ili drugim bibliotekama za upravljanje stanjem

U bibliotekama za upravljanje stanjem poput Reduxa, nepromjenjivost je temeljni princip. `Const` tvrdnje mogu pomoći u nametanju nepromjenjivosti u vašim reducerima i kreatorima akcija, sprječavajući slučajne mutacije stanja.


// Primjer Redux reducera

interface State {
  readonly count: number;
}

const initialState: State = { count: 0 } as const;

function reducer(state: State = initialState, action: { type: string }): State {
  switch (action.type) {
    default:
      return state;
  }
}

Internacionalizacija (i18n)

Kada radite s internacionalizacijom, često imate skup podržanih jezika i njihovih odgovarajućih lokalizacijskih kodova. `Const` tvrdnje mogu osigurati da taj skup ostane nepromjenjiv, sprječavajući slučajna dodavanja ili izmjene koje bi mogle narušiti vašu i18n implementaciju. Na primjer, zamislite podršku za engleski (en), francuski (fr), njemački (de), španjolski (es) i japanski (ja):


const supportedLanguages = ["en", "fr", "de", "es", "ja"] as const;

type SupportedLanguage = typeof supportedLanguages[number]; // Tip: "en" | "fr" | "de" | "es" | "ja"

function greet(language: SupportedLanguage) {
  switch (language) {
    case "en":
      return "Hello!";
    case "fr":
      return "Bonjour!";
    case "de":
      return "Guten Tag!";
    case "es":
      return "¡Hola!";
    case "ja":
      return "こんにちは!";
    default:
      return "Pozdrav nije dostupan za ovaj jezik.";
  }
}

Ograničenja i razmatranja

Alternative `as const` tvrdnjama

Iako su `const` tvrdnje moćan alat za nametanje nepromjenjivosti, postoje i drugi pristupi koje možete razmotriti:

Najbolje prakse

Zaključak

TypeScript `const` tvrdnje su vrijedan alat za nametanje nepromjenjivosti i poboljšanje sigurnosti tipova u vašem kodu. Korištenjem as const, možete naložiti prevoditelju da zaključi najuži mogući tip za vrijednost i označi sva svojstva kao readonly. To može pomoći u sprječavanju slučajnih izmjena, poboljšati predvidljivost koda i otključati precizniju provjeru tipova. Iako `const` tvrdnje imaju neka ograničenja, one su moćan dodatak TypeScript jeziku i mogu značajno poboljšati robusnost vaših aplikacija.

Strateškim uključivanjem `const` tvrdnji u vaše TypeScript projekte, možete pisati pouzdaniji, održiviji i predvidljiviji kod. Prihvatite moć inferencije nepromjenjivih tipova i podignite svoje prakse razvoja softvera na višu razinu.